package cn.plushine.controller;


import cn.plushine.pojo.*;
import cn.plushine.service.BaseGoodsService;
import cn.plushine.utils.ResMapUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;


/**
 * 货物信息
 */
@Api(tags = "货物信息")
@RestController
@RequestMapping("/admin/product/goods")
public class BaseGoodsController {

    @Autowired
    BaseGoodsService baseGoodsService;

    // 获取货物信息
    @ApiOperation(value = "获取货物信息")
    @GetMapping("/get")
    public HashMap<String, Object> get() {
        try {
            // 获取货物信息
            List<Goods> goodsDB = baseGoodsService.get();
            // 成功响应
            return ResMapUtils.encapsulation(200, "获取货物信息成功！", goodsDB);
        } catch (Exception e) {
            // 失败响应
            return ResMapUtils.encapsulation(201, "获取货物信息失败！", e.getMessage());
        }
    }

    // 获取品牌列表
    @ApiOperation(value = "获取品牌列表")
    @GetMapping("/getBrand")
    public HashMap<String, Object> getBrand() {
        try {
            // 获取品牌列表
            List<Brand> brandDB = baseGoodsService.getBrand();
            // 成功响应
            return ResMapUtils.encapsulation(200, "获取品牌列表成功！", brandDB);
        } catch (Exception e) {
            // 失败响应
            return ResMapUtils.encapsulation(201, "获取货物信息失败！", e.getMessage());
        }
    }

    // 获取单位列表
    @ApiOperation(value = "获取单位列表")
    @GetMapping("/getUnit")
    public HashMap<String, Object> getUnit() {
        try {
            // 获取单位列表
            List<Unit> unitDB = baseGoodsService.getUnit();
            // 成功响应
            return ResMapUtils.encapsulation(200, "获取单位列表成功！", unitDB);
        } catch (Exception e) {
            // 失败响应
            return ResMapUtils.encapsulation(201, "获取单位列表失败！", e.getMessage());
        }
    }

    // 获取仓库列表
    @ApiOperation(value = "获取仓库列表")
    @GetMapping("/getWarehouse")
    public HashMap<String, Object> getWarehouse() {
        try {
            // 获取仓库列表
            List<Warehouse> warehouseDB = baseGoodsService.getWarehouse();
            // 成功响应
            return ResMapUtils.encapsulation(200, "获取仓库列表成功！", warehouseDB);
        } catch (Exception e) {
            // 失败响应
            return ResMapUtils.encapsulation(201, "获取仓库列表失败！", e.getMessage());
        }
    }

    // 获取分区列表
    @ApiOperation(value = "获取分区列表")
    @GetMapping("/getArea/{id}")
    public HashMap<String, Object> getArea(@PathVariable int id) {
        try {
            // 获取分区列表
            List<WarehouseArea> areaDB = baseGoodsService.getArea(id);
            // 成功响应
            return ResMapUtils.encapsulation(200, "获取分区列表成功！", areaDB);
        } catch (Exception e) {
            // 失败响应
            return ResMapUtils.encapsulation(201, "获取分区列表失败！", e.getMessage());
        }
    }

    // 获取库位列表
    @ApiOperation(value = "获取库位列表")
    @GetMapping("/getPosition/{id}")
    public HashMap<String, Object> getPosition(@PathVariable int id) {
        try {
            // 获取库位列表
            List<WarehousePosition> positionDB = baseGoodsService.getPosition(id);
            // 成功响应
            return ResMapUtils.encapsulation(200, "获取库位列表成功！", positionDB);
        } catch (Exception e) {
            // 失败响应
            return ResMapUtils.encapsulation(201, "获取库位列表失败！", e.getMessage());
        }
    }

    // 修改货物信息
    @ApiOperation(value = "修改货物信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "goods", value = "货物信息", required = true, paramType = "body", dataType = "HashMap")
    })
    @PutMapping("/modify")
    public HashMap<String, Object> modify(@RequestBody HashMap goods) {
        // 将响应体内容以String格式接受，即json字符串
        try {
            // 修改货物信息
            baseGoodsService.modify(goods);
            // 货物id
            int gid = (int) goods.get("id");

            // 图片（bug-fixed：强转为image列表报错）
            List<Image> images = (List<Image>) goods.get("images");
            //可以把list转成json
            String str = JSON.toJSONString(images);
            //再把json转成list
            images = JSONObject.parseArray(str, Image.class);

            // 修改图片（先删，再用动态SQL加）
            baseGoodsService.deleteImage(gid);
            for (Image image : images) {
                baseGoodsService.addImage(gid, image.getId(), image.getUrl());
            }


            // 图片（bug-fixed：强转为image列表报错）
            List<Label> labels = (List<Label>) goods.get("labels");
            //可以把list转成json
            str = JSON.toJSONString(labels);
            //再把json转成list
            labels = JSONObject.parseArray(str, Label.class);
            // 修改规格（先删，再用动态SQL加）
            baseGoodsService.deleteLabel(gid);
            for (Label label : labels) {
                baseGoodsService.addLabel(gid, label.getId(), label.getName());
            }
            // 成功响应
            return ResMapUtils.encapsulation(200, "修改货物信息成功！", null);
        } catch (Exception e) {
            // 失败响应
            return ResMapUtils.encapsulation(201, "修改货物信息失败！", e.getMessage());
        }
    }

    // 添加货物信息
    @ApiOperation(value = "添加货物信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "goods", value = "货物信息", required = true, paramType = "body", dataType = "HashMap")
    })
    @PostMapping("/add")
    public HashMap<String, Object> add(@RequestBody HashMap goods) {
        // 将响应体内容以String格式接受，即json字符串
        try {
            // 添加货物信息
            baseGoodsService.add(goods);
            // 获取最新的货物id
            int finallyGoodsDB = baseGoodsService.getFinallyGoods();

            // 图片（bug-fixed：强转为image列表报错）
            List<Image> images = (List<Image>) goods.get("images");
            //可以把list转成json
            String str = JSON.toJSONString(images);
            //再把json转成list
            images = JSONObject.parseArray(str, Image.class);

            for (Image image : images) {
                baseGoodsService.addImage(finallyGoodsDB, 0, image.getUrl());
            }


            // 图片（bug-fixed：强转为image列表报错）
            List<Label> labels = (List<Label>) goods.get("labels");
            //可以把list转成json
            str = JSON.toJSONString(labels);
            //再把json转成list
            labels = JSONObject.parseArray(str, Label.class);
            // 修改规格（先删，再用动态SQL加）
            baseGoodsService.deleteLabel(finallyGoodsDB);
            for (Label label : labels) {
                baseGoodsService.addLabel(finallyGoodsDB, 0, label.getName());
            }
            // 成功响应
            return ResMapUtils.encapsulation(200, "添加货物信息成功！", null);
        } catch (Exception e) {
            // 失败响应
            return ResMapUtils.encapsulation(201, "添加货物信息失败！", e.getMessage());
        }
    }
}
